
\chapter{绪论}
\echapter{Preface}

    \section{研究背景}
    \esection{}
在当今的社会，互联网技术在各个领域已经深入人们的生活。计算机网络这一学科在互联网技术中一直起到举足轻重的作用。大部分的互联网产品在进行开发时，底层的网络通信对绝大部分的后端程序员是完全透明的\textsuperscript{\cite{李宇2018前后端分离框架在软件设计中的应用}}，他们的工作是基于某个通用可靠的、高集成度的组件，完成的上层业务实现，对其中的底层原理与细节却鲜有触及。理解学习底层网络通信框架的模型与细节对于理解操作系统原理、计算机网络原理以及计算机组成原理都有极大的作用。

当前主流的web应用服务器如Tomcat等为相关企业或个人用户提供着便利，来自俄罗斯的高性能的Nginx反向代理服务器\textsuperscript{\cite{Reese2008NGINX}}甚至也为我校的毕业设计系统提供着负载均衡的功能。它们都简化着开发者在搭建自己的业务时的工作，让开发者仅仅需要关心自己需要实现的上层业务。这些通用的服务器虽然有很多都是开源的，但是开发者如果在不清楚其底层原理的情况下直接使用，过程中因为意料之外的原因（如接口使用不当，底层出现bug等）而出现的问题将使得开发者难以解决。因此，许多具有大量人力物力的企业或团队也会选择自研一套方案，将整个服务系统都确保在自己的可触及范围之内。本项目的主要部分也恰好就是从操作系统的系统调用层面开始，完成一个通用的且具备当前主流需求的服务端框架。

图像识别技术是机器学习的一个重要的领域，它是指对图像进行对象识别\textsuperscript{\cite{蒋树强2016面向智能交互的图像识别技术综述与展望}}。随着ResNet残差网络在2015年的ImageNet大规模视觉识别竞赛获取胜利后，它的思想——通过构建恒等映射的方式，使得更深的网络得出的训练结果总是优于较浅的，近年来一直影响着图像识别研究者。

	\section{研究意义}
因科技的快速发展与进步，我们早已进入移动互联网、大数据时代，各式各样的终端设备都包含着用户的大量数据，对这些数据进行统计和学习（如学习用户的个人喜好为每个用户单独设计广告推送的内容）、交互（如微信、微博等社交软件）等行为都对人们的生活产生积极的意义。海量的数据使得人们必须在服务器上对其进行统一的管理。因此，设计出一套性能优良、高鲁棒性的运行于服务器的网络通信框架具有重要的意义。一个通用的服务器网络通信框架能帮助有相关需求的企业或个人快速部署自己的具体项目，在网络通信方面无需关注OSI七层网络模型中传输层及以下所有层，在集群部署方面无需关注某一个应用节点宕掉时对整个服务系统的影响、负载的合理分配等。同时，框架灵活地为用户提供定制应用层协议的接口、在大负荷情况下能对服务器做出保护措施等也是其重要职责。

    \section{主要工作内容}
    \esection{}
本课题所涉及的工作内容包括以下几个部分，它们的工作权重占比分别为：50\%，20\%，30\%。
	\begin{enumerate}
		\item 设计并实现通用的网络通信服务端框架。框架不借助任意第三方库，从底层的Linux系统调用和C标准库写起。框架独立于业务逻辑之外单独编译。可为有需要的用户提供具备反向代理、负载均衡、多线程、高性能、高稳定性、普遍适用的服务。图\ref{fig:osi}展示了本文提出的网络通信服务端框架工作所在OSI七层网络参考模型中的层级。
		\item 调研当前机器学习领域图像识别的相关技术并复现。根据实验结果，将具有较好的训练结果的模型作为上层业务部署到通用服务端框架中。
		\item 为图像识别应用设计并实现安卓客户端程序。
	\end{enumerate}

\begin{figure}[h]
	\centering
	\includegraphics[scale=0.45]{figures/OSI-model.pdf}
	\caption{本文提出的服务端网络通信框架所处OSI网络参考模型中的层级}
	\label{fig:osi}
\end{figure}

    \section{论文组织结构}
    \esection{}
    本文一共含有六个章节，各章节的主要内容如下:
    	\begin{enumerate}
    		\item 第一章，绪论。分为三个小节。首先描述了图像识别领域、计算机网络、互联网开发的背景，其次介绍了本课题的主要工作内容，最后是本文的组织结构。
    		\item 第二章，Linux I/O多路复用技术epoll。本章对Linux操作系统的三种的I/O多路复用机制（select，poll，epoll）进行研究，结合操作系统领域的基础理论，分析各机制的性能指标，并选用最性能最优的epoll嵌入到本文提出的服务端网络通信框架中。
    		\item 第三章，基于C++11的线程池的设计与实现。基于现实中的需求，为实际编码中出现过的各个复杂场景赋予异步执行的能力。首先介绍了线程池的接口能力，随后详细阐述了实现过程中的细节与原理。
    		\item 第四章，通用的服务端框架的设计与实现。本章是论文的核心。首先介绍了底层的网络通信模块的大体模型与工作流程，随后描述了底层框架如何与上层业务的完全解耦与配合，其次介绍了过载保护的逻辑，再次描述了上层业务的组织形式，包括应用层协议Http与WebSocket、选用高性能的序列化机制等，最后介绍了反向代理的设计与实现，包括请求过滤与转发、负载均衡。
    		\item 第五章，性能测试章节。本章内容将针对第四章完成的通用服务端框架做出性能测试，并在各个指标上对比Apache软件基金会开源Http服务器Tomcat。
    		\item 第六章，图像识别。本章分为2个小节。第一小节介绍了当前优秀的用于图像识别的神经网络ResNet的背景与原理。第二小节介绍了图像识别应用的安卓端程序的架构与实现。
    	\end{enumerate}

